//
// Created by dgy on 2022/9/26.
//
#include "iostream"
#include "regex"
using namespace std;
bool isNumber(string s){

    //初始认为这个字符串不表示数值
    bool isvalid = false;

    //记录小数点出现的次数
    int dot_C = 0;

    //记录e出现的次数
    int E_C = 0;

    //字符串s的下标
    int i= 0;

    //过滤字符串前面部分的空格
    while(s[i]==' ')
        i++;

    //如果第一个不为空格的字符是符号，下标自增跳过
    if(s[i]=='+'||s[i]=='-')
        i++;

    //遍历
    for(;i<s.size();i++){

        //出现数字，认为是数值
        if(s[i]>='0'&&s[i]<='9'){
            isvalid = true;
            continue;
        }

        //出现小数点
        if(s[i]=='.'){

            //小数点只能出现一次，并且要在e出现之前，若不符合返回false
            if(dot_C<1&&E_C<1){
                dot_C++;
                continue;
            }
            else
                return false;
        }

        //出现e
        if(s[i]=='e'||s[i]=='E'){

            //e只能出现一次，并且e出现之前必须满足数值要求（是一个合法的整数或者小数）。
            if(E_C<1&&isvalid)
                E_C++;
            else
                return false;

            //同时e的后面至少能够存放一个字符，如果越界返回false
            if(i+1<s.size()){

                //可能会出现符号，如果是符号，下标自增跳过
                if(s[i+1]=='+'||s[i+1]=='-'){
                    i++;
                }

                //需要重新判断e后面是否合法
                isvalid = false;
                continue;
            }
            return false;
        }

        //第二次出现空格，需要判断空格是否一直出现到字符串结束
        while(s[i]==' ')
            i++;

        //如果空格一直到字符串末尾，返回结果
        if(i>=s.size())
            return isvalid;

        //不符合上述所有情况，说明这肯定不是一个合法的数值
        return false;
    }

    //字符串遍历结束，返回结果
    return isvalid;
}
int main(){
    string s="0234";
    bool result=isNumber(s);
    cout<<result;
}
